﻿Imports System.ComponentModel
Imports Devart.Data.PostgreSql
Imports System.IO
Imports System.IO.MemoryStream


Public Class frmFactura
    Private cant_anterior As Integer
    Private cant_nueva As Integer
    Public cierrecaja As Boolean
    Private fecha As String = ConexionSGS.EjecutarQueryScalar("select current_date")
    Private horaServer As TimeSpan = ConexionSGS.EjecutarQueryScalar("select current_time")
    Private pc As String = My.Computer.Name
    Private usuario As Integer = My.Forms.MDI.Iduser.Caption.ToString


    Public Sub AgregarProductoDesdeBotonPersonalizado(ByVal textbox As System.Windows.Forms.TextBox)
        Try
            IditemventaTextEdit.EditValue = CInt(textbox.Text)
            btAgregar.PerformClick()
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error al momento de agregar un producto desde los botones personalizados en la pantalla de facturación", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "AgregarProductoDesdeBotonPersonalizado")
        End Try
    End Sub

    Public Sub ConstruirBotones()
        Try
            BotonesPersonalizadosSGS.ConstruirMenuRapidoFacturacion(txt1, btn1, txt2, btn2, txt3, btn3, txt4, btn4, txt5, btn5, txt6, btn6, txt7, btn7, txt8, btn8, txt9, btn9)
        Catch ex As Exception
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgVinicio, "Error al momento de construir los botones personalizados en la pantalla de facturación", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "ConstruirBotones")
        End Try
    End Sub
    Public Sub LimpiarPantalla()
        Try
            'Inicializa o limpia los controles
            tNombrePC.Text = pc
            subsidiodisp.EditValue = 0
            subsidiootorgado.EditValue = 0
            thora.Text = horaServer.ToString
            FechaDateTimePicker.Text = fecha
            IdUsuario.EditValue = usuario
            IditemventaTextEdit.EditValue = Nothing
            IdclienteTextEdit.Focus()
            tprecioventa.EditValue = 0
            tcantidad.Value = 0
            ttotallinea.EditValue = 0
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al momento de inicializar los controles.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se calculó el ultimo idfactura de esta cajaHa ocurrido un error al momento de inicializar los controles.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LimpiarPantalla()")
        End Try
        Try
            'Devuelve el último idfactura
            Dim idfact As Integer = ConexionSGS.EjecutarQueryScalar("SELECT COALESCE(MAX(idfactura),1) AS EXPR1 FROM facturas;")
            'IdfacturaTextBox.Text = idfact + 1
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al calcular el idfactura.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se calculó el ultimo idfactura de esta caja.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "RestauraExistenciaAlCancelar()")
        End Try
        Try
            'inserta datos iniciales de la factura
            Dim idfact As Integer = 1
            idfact = ConexionSGS.EjecutarQueryScalar("SELECT COALESCE(MAX(idfactura),1) AS EXPR1 FROM facturas;")
            ConexionSGS.EjecutarQueryNonQuery(String.Format("INSERT INTO facturas(idfactura, fecha, hora, enproceso, nombrepc, iduser, nula) VALUES ({0}, CURRENT_DATE, CURRENT_TIME, {1}, '{2}', {3}, {4});", idfact, True, pc, usuario, True))
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No se pudo insertar el encabezado de la factura.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Falló la sentencia InsertQueryDatosBasicos() en la función LimpiarPantalla(), frmFactura", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LimpiarPantalla()")
        End Try
        'cargando cliente default
        Try
            IdclienteTextEdit.EditValue = ConexionSGS.EjecutarQueryScalar("select idcliente from clientes where esdefault = 'true'")
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No actualizaron los datos del cliente.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error cargando el cliente default, en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LimpiarPantalla()")
        End Try
        'Limpiar detalle
        Try
            'elimina facturasdetalletemp
            ConexionSGS.EjecutarQueryNonQuery("DELETE FROM facturasdetalletemp WHERE idfactura = (SELECT COALESCE(MAX(idfactura),1) AS EXPR1 FROM facturas);")
            FacturasdetalletempTableAdapter.FillByIdFactura(DbFireAndIceDataSet.facturasdetalletemp, Val(IdfacturaTextBox.Text))
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "El detalle de la factura no se eliminó.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en función LimpiarPantalla() en frmFactura; no pudo limpiar facturadetalletemp.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LimpiarPantalla()")
        End Try
        Try
            'Calcula el ultimo numero de ticket
            NumfacturaTextEdit.EditValue = ConexionSGS.EjecutarQueryScalar("SELECT MAX(numfactura)+1 AS numfactura FROM facturas ORDER BY numfactura DESC")
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Error al momento de calcular el número de Ticket.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al momento de calcular el número de Ticket.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LimpiarPantalla()")
        End Try
        Try
            'Llena la tabla de pago con los datos de la factura actual
            FacturaspagoTableAdapter1.FillByIdFact(DbFireAndIceDataSet.facturaspago, Val(IdfacturaTextBox.Text))
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ocurrió un error al filtrar los apgos de la factura al iniciar.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en el filtro de facturas pago en limpiarpantalla() en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, " FacturaspagoTableAdapter1.FillByIdFact")
        End Try
        Try
            'Limpia los mensajes de error (ErrorProvider)
            ErrorProvider1.SetError(IditemventaTextEdit, Nothing)
            ErrorProvider1.SetError(tprecioventa, Nothing)
            ErrorProvider1.SetError(tcantidad, Nothing)
            ErrorProvider1.SetError(IdUsuario, Nothing)
            ErrorProvider1.SetError(IdclienteTextEdit, Nothing)
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ocurrió un error al momento de limpiar los mensajes de error (ErrorProvider).")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Ocurrió un error al momento de limpiar los mensajes de error (ErrorProvider).", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "LimpiarPantalla()")
        End Try
    End Sub

    Public Sub RestauraExistenciaAlCancelar()
        Try
            'regresar existencia de productos
            ConexionSGS.EjecutarQueryNonQuery(String.Format("SELECT aumenta_existencias({0});", IdfacturaTextBox.Text))
            ConexionSGS.EjecutarQueryNonQuery(String.Format("SELECT aumenta_existencias_itemespecial({0});", IdfacturaTextBox.Text))
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No se restauró la existencia de los productos en la factura cancelada.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se restauró la existencia de los productos en la factura cancelada.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "RestauraExistenciaAlCancelar()")
        End Try
    End Sub

    Public Function ValidarFacturaDet()
        If IditemventaTextEdit.Text.Length = 0 Then
            ErrorProvider1.SetError(IditemventaTextEdit, "Debe ingresar un Item de Venta")
        ElseIf tprecioventa.EditValue <= 0 Then
            ErrorProvider1.SetError(tprecioventa, "Debe ingresar un precio de venta")
        ElseIf tcantidad.EditValue <= 0 Then
            ErrorProvider1.SetError(tcantidad, "Debe ingresar una cantidad")
        Else
            ErrorProvider1.SetError(IditemventaTextEdit, Nothing)
            ErrorProvider1.SetError(tprecioventa, Nothing)
            ErrorProvider1.SetError(tcantidad, Nothing)
            Return 0
        End If
        Return 1
    End Function

    Public Function ValidarFactura()
        If IdUsuario.Text.Length = 0 Then
            ErrorProvider1.SetError(IdUsuario, "Debe ingresar el usuario que atiende")
        ElseIf gviewDetalle.RowCount() <= 0 Then
            ErrorProvider1.SetError(IditemventaTextEdit, "Debe ingresar al menos un item.")
        ElseIf IdclienteTextEdit.Text = "" Then
            ErrorProvider1.SetError(IdclienteTextEdit, "Seleccione un cliente.")
        Else
            ErrorProvider1.SetError(IdUsuario, Nothing)
            ErrorProvider1.SetError(IditemventaTextEdit, Nothing)
            ErrorProvider1.SetError(IdclienteTextEdit, Nothing)
            Return 0
        End If
        Return 1
    End Function

    Public Function ItemDuplicado()
        Dim no_reg As Integer = -1
        For i As Integer = 0 To gviewDetalle.DataRowCount - 1
            If gviewDetalle.GetRowCellValue(i, "Id") = IditemventaTextEdit.EditValue Then
                no_reg = i
            End If
        Next i
        Return no_reg
    End Function

    Private Sub FacturasBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FacturasBindingNavigatorSaveItem.Click
        Validate()
        FacturasBindingSource.EndEdit()
        TableAdapterManager.UpdateAll(DbFireAndIceDataSet)
    End Sub

    Private Sub frmFactura_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            'Función que construye el menú rápido
            ConstruirBotones()

            ''Bloquear botón de de historial de facturas segun su permiso
            SeguridadSGS.Permisos(My.Resources.SeguridadSGS.HistorialFactura, btHistorial) ''Formulario de Historial de Factura


            'Carga de data inicial en los controles
            UsuariosTableAdapter.Fill(DbFireAndIceDataSet.usuarios)
            ItemventaTableAdapter.Fill(DbFireAndIceDataSet.itemventa)
            ClientesTableAdapter1.FillByEstadoActivoInactivo(DbFireAndIceDataSet.clientes, True)
            VclienteTableAdapter.FillByEstado(DbFireAndIceDataSet.vcliente, True)
            EmpresasTableAdapter.Fill(DbFireAndIceDataSet.empresas)

            'Define la variable que controla si el llamado de cerrar la pantalla es desde la pantalla de cierre caja
            cierrecaja = False

            'Limpia la pantalla de factura y setea valores por defecto dejando lista una nueva factura
            LimpiarPantalla()
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, My.Resources.StringGlobal.msjNotificacion, My.Resources.StringGlobal.ErrorCargarDatos)
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error al cargar los datos en el LOAD del formulario.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Protected Friend Sub IdclienteTextEdit_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdclienteTextEdit.EditValueChanged
        Try
            If IdclienteTextEdit.EditValue <> Nothing Then

                ActualizaDatoscliente()

                Dim consumodia As Integer
                If Val(FacturasTableAdapter1.ScalarQuerySubsidioConsumido(fecha, IdclienteTextEdit.EditValue)) Then
                    consumodia = Val(FacturasTableAdapter1.ScalarQuerySubsidioConsumido(fecha, IdclienteTextEdit.EditValue))
                Else
                    consumodia = 0
                End If

                subsidiodisp.EditValue = subsidiootorgado.EditValue - consumodia

                'Validacion para subsidio de Cargill
                'ValidaSubsidioCargill(0, 0, consumodia)
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No actualizaron los datos del cliente.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en IdclienteTextEdit_EditValueChanged, en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub tcantidad_ValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tcantidad.ValueChanged
        If Not IsDBNull(tprecioventa.EditValue) And Not IsDBNull(tcantidad.Value) Then
            ttotallinea.EditValue = tprecioventa.EditValue * tcantidad.Value
        End If
    End Sub

    Private Sub btAgregar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAgregar.Click
        If ValidarFacturaDet() = 0 Then
            Try
                Try
                    'regresa el ultimo idfactura de esa caja
                    IdfacturaTextBox.Text = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT MAX(idfactura) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}');", My.Computer.Name))
                Catch ex As Exception
                    AlertControl1.AppearanceCaption.ForeColor = Color.Red
                    AlertControl1.Show(Me, "Error", "Ha ocurrido un error al calcular el idfactura.")
                    LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se calculó el ultimo idfactura de esta caja.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "RestauraExistenciaAlCancelar()")
                End Try

                'Calcula el subsidio consumido en el dia
                Dim consumodia As Integer
                consumodia = Val(FacturasTableAdapter1.ScalarQuerySubsidioConsumido(FechaDateTimePicker.Text, IdclienteTextEdit.EditValue))
                If IsDBNull(consumodia) Then
                    consumodia = 0
                End If

                'Valida si el item es especial y llama la pantalla FRMAGREGARITEMESPECIAL
                'If IditemventaTextEdit.EditValue = 139 Then
                'frmAgregarItemEspecial.ShowDialog()
                'Else
                'Validacion para subsidio condicionado de Cargill
                'ValidaSubsidioCargill(IditemventaTextEdit.EditValue, 1, consumodia)

                ConexionSGS.EjecutarQueryNonQuery("select reduce_existencia_x_item(" + Str(IditemventaTextEdit.EditValue) + "," + Str(tcantidad.Value) + ");")

                Dim row As DataRowView = CType(IditemventaTextEdit.Properties.GetRowByKeyValue(IditemventaTextEdit.EditValue), DataRowView)
                Dim costo As Object = row("costototal")

                ConexionSGS.EjecutarQueryNonQuery(String.Format("select inserta_factdet_temp({0}, {1},{2}, {3},{4},{5})", Str(IditemventaTextEdit.EditValue), Str(tcantidad.Value), Str(ttotallinea.EditValue), Str(tprecioventa.EditValue), Str(costo), IdfacturaTextBox.Text))
                'End If

                FacturasdetalletempTableAdapter.FillByIdFactura(DbFireAndIceDataSet.facturasdetalletemp, Val(IdfacturaTextBox.Text))
                IditemventaTextEdit.EditValue = Nothing
                IditemventaTextEdit.Focus()
                tcantidad.Value = 1
            Catch ex As Exception
                AlertControl1.AppearanceCaption.ForeColor = Color.Red
                AlertControl1.Show(Me, "Error", "No se agregó el producto a la venta.")
                LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en el botón agregar en frmFactura. Agregando item al detalle de factura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
            End Try
        End If
    End Sub


    Private Sub btConsumo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btConsumo.Click
        If IdclienteTextEdit.Text = "" Then
            ErrorProvider1.SetError(IdclienteTextEdit, "Seleccione un cliente.")
        Else
            ErrorProvider1.SetError(IdclienteTextEdit, Nothing)
            frmConsumodelDia.ShowDialog()
        End If
    End Sub

    Private Sub cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cancelar.Click
        Dim opcion As Integer
        opcion = MsgBox("¿Seguro que desea cancelar la factura?", MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Confirmación")
        If opcion = vbYes Then
            Try
                Dim idfactura As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT MAX(idfactura) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}');", My.Computer.Name))
                ConexionSGS.EjecutarQueryNonQuery(String.Format("select elimina_factura_completa({0})", idfactura))
                LimpiarPantalla()
            Catch ex As Exception
                AlertControl1.AppearanceCaption.ForeColor = Color.Red
                AlertControl1.Show(Me, "Error", "Ha ocurrido un error al cancelar la factura.")
                LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "No se calculó el ultimo idfactura de esta caja.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "RestauraExistenciaAlCancelar()")
            End Try
        End If
    End Sub

    Private Sub tCliente_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tCliente.EditValueChanged
        Try
            If tCliente.EditValue <> Nothing Then
                IdclienteTextEdit.EditValue = tCliente.GetColumnValue("idcliente")
                ActualizaDatoscliente()
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No se cargaron algunos datos del cliente.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en el tCliente_EditValueChanged en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Public Function GetConnnectionString()
        Const fic As String = "configuracion.txt"
        Dim diract As String = ""
        diract = System.IO.Directory.GetCurrentDirectory()

        Dim direccion As String = ""

        direccion = String.Format("{0}\{1}", diract, fic)

        Dim connstring As String = ""
        Try
            Dim sr As New System.IO.StreamReader(direccion)
            connstring = sr.ReadToEnd()
            sr.Close()
            Console.WriteLine(connstring)
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Error al obtener la conexion con la base de datos.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en la función GetConnnectionString de la pantalla frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, "GetConnnectionString()")
        End Try
        Return connstring
    End Function

    Private Sub frmFactura_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        If cierrecaja = False Then
            Dim opcion As Integer
            opcion = MsgBox("¿Seguro que desea cancelar la factura?", MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Confirmación")
            If opcion = vbYes Then
                Try

                    Dim idfactura As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT COALESCE(MAX(idfactura),1) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}');", My.Computer.Name))
                    ConexionSGS.EjecutarQueryNonQuery(String.Format("select elimina_factura_completa({0})", idfactura))
                Catch ex As Exception
                    AlertControl1.AppearanceCaption.ForeColor = Color.Red
                    AlertControl1.Show(Me, "Error", "Ha ocurrido un error al cancelar la factura.")
                    LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en las sentencias para cancelar la factura en la pantalla frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
                End Try
            Else
                e.Cancel = True
            End If
        Else
            Try

                Dim idfactura As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT MAX(idfactura) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}');", My.Computer.Name))
                ConexionSGS.EjecutarQueryNonQuery(String.Format("select elimina_factura_completa({0})", idfactura))
            Catch ex As Exception
                AlertControl1.AppearanceCaption.ForeColor = Color.Red
                AlertControl1.Show(Me, "Error", "Ha ocurrido un error al cancelar la factura.")
                LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en las sentencias para cancelar la factura en la pantalla frmFactura, después de realizaar el cierre de caja.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
            End Try
        End If
    End Sub

    Private Sub btEfectuarPago_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btEfectuarPago.Click
        Try
            Dim totalfactura As Double = 0
            totalfactura = ConexionSGS.EjecutarQueryScalar(String.Format("SELECT SUM(totallinea) AS total FROM facturasdetalletemp WHERE (idfactura = (SELECT MAX(idfactura) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}'))) GROUP BY idfactura", My.Computer.Name.ToString))

            Dim muestracliente As Boolean = True
            'Evalua si el cliente no tiene subsidio para mostrar el Cliente "No Afiliado" cuando no es el que está seleccionado(1)
            If subsidiodisp.EditValue = 0 And subsidiootorgado.EditValue > 0 And Str(Val(IdclienteTextEdit.EditValue)) <> "1" Then
                muestracliente = False
            End If

            'SI el cliente puede pagar por credito o planilla registra el cliente a pesar de no tener subsidio
            If ConexionSGS.EjecutarQueryScalar(String.Format("select permitecredito from clientes where idcliente = '{0}'", IdclienteTextEdit.EditValue)) Or ConexionSGS.EjecutarQueryScalar(String.Format("select permiteplanilla from clientes where idcliente = '{0}'", IdclienteTextEdit.EditValue)) Then
                muestracliente = True
            End If


            If totalfactura = 0 Then
                ErrorProvider1.SetError(IditemventaTextEdit, "No ha agregado un item a la venta.")
            ElseIf muestracliente = False Then
                ErrorProvider1.SetError(IditemventaTextEdit, Nothing)
                IdclienteTextEdit.EditValue = CStr(ConexionSGS.EjecutarQueryScalar("select idcliente from clientes where esdefault = 't'"))
                MsgBox("El cliente no dispone de subsidio. Se facturará al cliente No Afiliado", MsgBoxStyle.Exclamation, "Notificación")
                frmPagarFactura.ShowDialog()
            Else
                ErrorProvider1.SetError(IditemventaTextEdit, Nothing)
                frmPagarFactura.ShowDialog()
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al intentar efectuar el pago en la factura.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en las sentencias para llamar frmPagarFactura en la pantalla frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub gridFactDetalle_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles gridFactDetalle.Validating
        Try
            FacturasdetalletempTableAdapter.Update(DbFireAndIceDataSet)
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al intentar aplicar los cambios.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en la sentencia gridFactDetalle_Validating en la pantalla frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub tprecioventa_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tprecioventa.EditValueChanged
        Try
            If IditemventaTextEdit.EditValue <> Nothing Then
                ttotallinea.EditValue = tprecioventa.EditValue * tcantidad.Value
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ocurrió un error al actualizar el precio de venta.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en tprecioventa_EditValueChanged, en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub tcantidad_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tcantidad.EditValueChanged
        Try
            If IditemventaTextEdit.EditValue <> Nothing Then
                If IditemventaTextEdit.EditValue = 139 Then
                    tcantidad.Value = 1
                End If
                ttotallinea.EditValue = tprecioventa.EditValue * tcantidad.Value
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ocurrió un error al actualizar la cantidad del producto venta.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en tcantidad_EditValueChanged, en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub SimpleButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton2.Click
        Try
            Dim id_item As Integer = gviewDetalle.GetRowCellValue(gviewDetalle.FocusedRowHandle, "iditemventa")
            Dim cant As Integer = gviewDetalle.GetRowCellValue(gviewDetalle.FocusedRowHandle, "cantidad")
            Dim idfactura As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("(SELECT COALESCE(MAX(idfactura),1) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}'))", My.Computer.Name))
            'verificando si está eliminando el plato del día para deshabilitar el subsidio
            Dim consumodia As Integer
            If Val(FacturasTableAdapter1.ScalarQuerySubsidioConsumido(fecha, IdclienteTextEdit.EditValue)) Then
                consumodia = Val(FacturasTableAdapter1.ScalarQuerySubsidioConsumido(fecha, IdclienteTextEdit.EditValue))
            Else
                consumodia = 0
            End If

            ConexionSGS.EjecutarQueryNonQuery(String.Format("select aumenta_existencia_x_item({0},{1});", Str(id_item), Str(cant)))
            ConexionSGS.EjecutarQueryNonQuery(String.Format("DELETE FROM facturasdetalletemp WHERE idfactura = (SELECT COALESCE(MAX(idfactura),1) AS EXPR1 FROM facturas GROUP BY nombrepc HAVING (nombrepc = '{0}')) AND iditemventa = {1};", My.Computer.Name, Str(id_item)))

            'Subsidio para Cargill
            'ValidaSubsidioCargill(id_item, 2, consumodia)

            FacturasdetalletempTableAdapter.FillByIdFactura(DbFireAndIceDataSet.facturasdetalletemp, idfactura)
            tcantidad.Value = 1
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al intentar eliminar el producto venta.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en la sentencia para aumentar existencia al eliminar un item del detalle de factura en la pantalla frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        thora.Text = TimeOfDay.TimeOfDay.ToString
    End Sub

    Private Sub IditemventaTextEdit_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles IditemventaTextEdit.KeyPress
        If e.KeyChar = ChrW(Keys.Enter) Then
            AgregarClick()
        End If
    End Sub

    Private Sub AgregarClick()
        btAgregar.PerformClick()
    End Sub

    Private Sub tcantidad_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles tcantidad.KeyPress
        If e.KeyChar = ChrW(Keys.Enter) Then
            AgregarClick()
        End If
    End Sub

    Private Sub RepositoryItemTextEdit1_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RepositoryItemTextEdit1.Leave
        Try
            cant_nueva = gviewDetalle.GetRowCellValue(gviewDetalle.FocusedRowHandle, "cantidad")
            Dim id_item As Integer = gviewDetalle.GetRowCellValue(gviewDetalle.FocusedRowHandle, "iditemventa")
            Dim cant As Integer = cant_nueva - cant_anterior

            ConexionSGS.EjecutarQueryNonQuery(String.Format("select reduce_existencia_x_item({0},{1});", Str(id_item), Str(cant)))

        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "Ha ocurrido un error al cambiar la cantidad al producto venta.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en la sentencia para actualizar existencia al modificar cantidad en el grid del detalle de factura en la pantalla frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub RepositoryItemTextEdit1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RepositoryItemTextEdit1.Enter
        cant_anterior = gviewDetalle.GetRowCellValue(gviewDetalle.FocusedRowHandle, "cantidad")
    End Sub

    Private Sub btHistorial_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btHistorial.Click
        My.Forms.frmHistorialFacturas.ShowDialog()
    End Sub

    Private Sub btCierreCaja_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCierreCaja.Click
        My.Forms.frmAutentificarCierreCaja.ShowDialog()
    End Sub

    Private Sub tcodigo_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tcodigo.EditValueChanged

        Try
            If tCliente.EditValue <> Nothing Then
                IdclienteTextEdit.EditValue = tcodigo.GetColumnValue("idcliente")
                ActualizaDatoscliente()
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No se cargaron algunos datos del cliente.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en tcodigo_EditValueChanged de la pantalla frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub btRedEfectivo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btRedEfectivo.Click
        My.Forms.frmAutentificarMovCaja.ShowDialog()
    End Sub

    Private Sub btCalculadora_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCalculadora.Click
        Try
            System.Diagnostics.Process.Start("calc")
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No se pudo abrir la calculadora.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Llamando la calculadora de windows en pantalla frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub

    Private Sub IdclienteTextEdit_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdclienteTextEdit.Leave
        IditemventaTextEdit.Focus()
    End Sub

    Private Sub IditemventaTextEdit_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IditemventaTextEdit.EditValueChanged
        Try
            If IditemventaTextEdit.EditValue <> Nothing Then
                Dim row As DataRowView = CType(IditemventaTextEdit.Properties.GetRowByKeyValue(IditemventaTextEdit.EditValue), DataRowView)
                Dim precio As Object = row("precioventa")
                tprecioventa.EditValue = precio
                tcantidad.Value = 1
                ttotallinea.EditValue = 0
                ttotallinea.EditValue = tprecioventa.EditValue * tcantidad.Value
            End If
        Catch ex As Exception
            AlertControl1.AppearanceCaption.ForeColor = Color.Red
            AlertControl1.Show(Me, "Error", "No actualizaron los datos del producto a vender.")
            LogSGS.RegistrarLogSinEnviarCorreo(My.Resources.StringGlobal.prgAngely, "Error en IditemventaTextEdit_EditValueChanged, en frmFactura.", ex, My.Resources.StringGlobal.mdlFacturacion, Name, sender.GetType.FullName.ToString)
        End Try
    End Sub


    Public Sub ValidaSubsidioCargill(ByVal iditem As Integer, ByVal accion As Integer, ByVal subconsumido As Double)
        Dim idempresa As Integer
        idempresa = ConexionSGS.EjecutarQueryScalar(String.Format("select idempresa from clientes where idcliente = '{0}';", IdclienteTextEdit.EditValue))
        If idempresa = 10 Then
            'setear el subsidio a 0
            subsidiodisp.EditValue = 0

            Dim itemsubsidiado As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("select iditemventa from empresaitemsubsidiado where idempresa = {0}", idempresa))

            'Si la accion es agregar (1)
            If accion = 1 Then
                If iditem = itemsubsidiado Then
                    subsidiodisp.EditValue = subsidiootorgado.EditValue - subconsumido
                End If
            End If

            'Si la accion es eliminar (2)
            If accion = 2 Then
                If iditem = itemsubsidiado Then
                    subsidiodisp.EditValue = 0
                End If
            End If

            'Si el item está en el detalle otorgar el subsidio
            Dim itemsubsidiadoendetalle As Integer = ConexionSGS.EjecutarQueryScalar(String.Format("select count(iditemventa) from facturasdetalletemp where iditemventa = {0}", itemsubsidiado))
            If itemsubsidiadoendetalle > 0 Then
                subsidiodisp.EditValue = subsidiootorgado.EditValue - subconsumido
            End If

        End If
    End Sub

    Private Sub btn1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
        AgregarProductoDesdeBotonPersonalizado(txt1)
    End Sub

    Private Sub btn2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn2.Click
        AgregarProductoDesdeBotonPersonalizado(txt2)
    End Sub

    Private Sub btn3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn3.Click
        AgregarProductoDesdeBotonPersonalizado(txt3)
    End Sub

    Private Sub btn4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn4.Click
        AgregarProductoDesdeBotonPersonalizado(txt4)
    End Sub

    Private Sub btn5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn5.Click
        AgregarProductoDesdeBotonPersonalizado(txt5)
    End Sub

    Private Sub btn6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn6.Click
        AgregarProductoDesdeBotonPersonalizado(txt6)
    End Sub

    Private Sub btn7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn7.Click
        AgregarProductoDesdeBotonPersonalizado(txt7)
    End Sub

    Private Sub btn8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn8.Click
        AgregarProductoDesdeBotonPersonalizado(txt8)
    End Sub

    Private Sub btn9_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn9.Click
        AgregarProductoDesdeBotonPersonalizado(txt9)
    End Sub

    Private Sub SimpleButton8_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SimpleButton8.Click
        ConstruirBotones()
    End Sub

    Public Sub ActualizaDatoscliente()
        IdempresaTextEdit.EditValue = IdclienteTextEdit.GetColumnValue("idempresa")
        subsidiootorgado.EditValue = IdclienteTextEdit.GetColumnValue("montosubsidio")
        tCliente.EditValue = IdclienteTextEdit.GetColumnValue("idcliente")
        tcodigo.EditValue = IdclienteTextEdit.GetColumnValue("idcliente")

        If IsDBNull(IdclienteTextEdit.GetColumnValue("fotografia")) Then
            Dim fotoNA As Byte()
            fotoNA = ConexionSGS.EjecutarQueryScalar("select fotografia from clientes where idcliente = '1'")
            Dim data As Byte() = fotoNA
            Dim ms As System.IO.MemoryStream = New MemoryStream(data)
            foto.Image = Image.FromStream(ms)
        Else
            Dim data As Byte() = IdclienteTextEdit.GetColumnValue("fotografia")
            Dim ms As System.IO.MemoryStream = New MemoryStream(data)
            foto.Image = Image.FromStream(ms)
        End If
    End Sub

    Private Sub FechaDateTimePicker_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FechaDateTimePicker.EditValueChanged

    End Sub

    Private Sub ttotallinea_EditValueChanged(sender As System.Object, e As System.EventArgs) Handles ttotallinea.EditValueChanged

    End Sub
End Class
